home *** CD-ROM | disk | FTP | other *** search
/ AGA Toolkit '97 / The AGA Toolkit '97.iso / text / misc / port / oldstuff / portsource.lha / Port139.S < prev    next >
Encoding:
Text File  |  1993-06-04  |  31.9 KB  |  2,009 lines

  1. TestMode    =    0
  2.  
  3.     INCDIR    "INCLUDE:"
  4.     INCLUDE    "Darkness.I"
  5.     INCLUDE    "LibOffSet"
  6.     INCLUDE    "Exec/Memory.I"
  7.     INCLUDE    "Dos/Dos.I"
  8.  
  9. * 4-Jun-93
  10. * 47 days of hard coding
  11.  
  12. ; V1.01
  13. ; - Added bigger understanding of PC box characters.
  14. ; - Now also understands one-wide box chars, and thick corner changed to #,
  15. ;   single corner to +.
  16.  
  17. ; V1.02
  18. ; - Added bad mode error, and error on no space between mode and the rest.
  19.  
  20. ; V1.10
  21. ; - Cut endspace.
  22. ; - Text output.
  23.  
  24. ; V1.13
  25. ; - Percentage & size change.
  26. ; - Extra LF.
  27. ; - Extra CR removal in ToPC mode.
  28.  
  29. ; V1.16
  30. ; - Faster translate routines - 25% speedup in FromPC.
  31. ; - 6 more in FromPC.
  32. ; - New helptext.
  33.  
  34. ; V1.18  11-Feb-93
  35. ; - Upper and lower case modes.
  36.  
  37. ; V1.22  19-Feb-93
  38. ; - Tabs to spaces:
  39. ; - 3 new PC box chars.
  40. ; - Bug fixed that confused Port if the end of the commandline had spaces.
  41. ; - Spaces to tabs.
  42.  
  43. ; V1.24  21-Feb-93
  44. ; - Size reduced by 48.
  45. ; - Bug fixed where tabconversion wasn't turned on in SpacesToTabs
  46. ;   causing some strange behavior.
  47. ; - Reduced code size by making routines use same parts of code.
  48. ; - Logic check for options.
  49. ; - +20% when quiet.
  50.  
  51. ; V1.25  11-Mar-93
  52. ; - Buffer overflow bug fixed.
  53. ; - New table conversion system.
  54. ; - Buffered input.
  55. ; - Handles one filename differently.
  56. ; - CTRL+C detection.
  57. ; - Doesn't screw up PP files.
  58. ; - 6856 -> 6636.
  59. ; - 9 new PC chars.
  60. ; - End LF removal.
  61. ; - No longer translates one space.
  62.  
  63. ; V1.28  20-Mar-93
  64. ; - First 7292 -> 6952 = -340 !
  65. ; - Bug fixed: Some bytes got cut off from the beginning if the file was
  66. ;   less than 4 bytes long.
  67. ; - Bug fix: Amy->PC didn't make CR+LF pairs as it should have in V1.25
  68. ;   same with Amy->SF
  69. ; - Most modes use table now.
  70. ; - Priorities changed for EndSpace removal and translation. This also fixes
  71. ;   the bug where endLFs didn't get removed if there were nulls or CTRL+Zs
  72. ;   etc.
  73. ; - Code rationalized, size down.
  74. ; - Doesn't trigger anything from CR's.
  75. ; - Make EOLs option.
  76. ; - Automode.
  77.  
  78. ; V1.30  27-Mar-93
  79. ; - Added 13 PC chars.
  80. ; - No longer can convert 1 space to tabs (made no sense).
  81.  
  82. ; V1.37  30-Apr-93
  83. ; - Changed automatic "Mode" to "Type".
  84. ; - Full PC->Amiga support implemented.
  85. ; - Optimized and reduced code.
  86. ; - Now uses includes.
  87. ; - Automatically find differently suffixed files by the the prefacing
  88. ;   name.
  89. ; - Ami changed to Amy.
  90. ; - A mode which throws out everything except pure ASCII stuff.
  91. ; - Fixed the slight flickering of various texts.
  92. ; - Fixed a bug which caused endspace removal to leave a space after some
  93. ;   lines when SpacesToTabs was on.
  94. ; - A fast PC->Amiga conversion routine.
  95. ; - Now you can specify only the destination directory, and the file will
  96. ;   be written correctly.
  97.  
  98. ; V1.38  5-May-93
  99. ; - Fixed some small bugs in commandline handling which caused big shit.
  100. ;   65535 bytes big, ;)
  101. ; - Fixed errors in stack handling which caused gurus on errors.
  102.  
  103. ; V1.39  4-Jun-93
  104. ; - Fixed the FromPC table, most of the box characters were messed up, and
  105. ;   made a few better choices for conversion.
  106. ; - FromPC didn't remove CRs anymore, oops.
  107. ; - ToPC and ToSF7 didn't work, now they do. (Were always FromPC)
  108.  
  109. ; Things to do:
  110. ; - Load the first 10K, check, then load the rest.
  111. ; - Don't scan back in the file when checking for PP.
  112. ; - Adjustment of the buffer sizes used for conversion.
  113. ; - Wildcards.
  114. ; - Some kind of a config file.
  115. ; - Full Amiga->PC character support.
  116. ; - Disable break when converting to same file.
  117. ; - Add exit error codes.
  118. ; - PowerPacker decrunch.
  119.  
  120. ; During the program:
  121. ; A0 = Source
  122. ; A1 = Dest
  123. ; A2 = Spacebuf
  124. ; A3 = Translation table
  125.  
  126. ; D0 = Current char
  127. ; D1 = Load counter
  128. ; D2 = Savebyte counter
  129. ; D3 = translation char
  130.  
  131.  
  132.     IF    TestMode=1
  133.     lea    Test_ComLine,a0
  134.     move.l    #Test_Len,d0
  135.     ENDC
  136.  
  137. ProgStart:
  138.     move.l    a7,OldStack
  139.     clr.b    -1(a0,d0.l)
  140.     movem.l    a0,-(a7)
  141.     move.w    d0,CommandLen
  142.     add.l    d0,a0
  143.     subq.l    #1,a0
  144.     move.l    a0,CommandEnd
  145.  
  146.     lea    _DosName,a1
  147.     moveq    #0,d0
  148.     move.l    ExecBase,a6
  149.     jsr    _LVOOpenLibrary(a6)
  150.     move.l    d0,_DosBase
  151.  
  152.     move.l    _DosBase,a6
  153.     jsr    _LVOOutput(a6)
  154.     move.l    d0,OutStruct
  155.  
  156.     IF    TestMode=1
  157.     bne    Err_TestMode
  158.     ENDC
  159.  
  160.     move.l    #Text_CursorOff,d2
  161.     moveq    #5,d3
  162.     bsr    PrintText
  163.  
  164.     movem.l    (a7)+,a0        ; CommandStart
  165.     tst.b    (a0)            ; If blank commandline, instructions
  166.     beq    HelpText
  167.     cmp.b    #"?",(a0)
  168.     beq    HelpText
  169.  
  170. ParseStart:
  171.     cmp.b    #"-",(a0)
  172.     beq    CheckOption
  173.  
  174. Parse:
  175.     cmp.b    #" ",1(a0)        ; at least one space after option
  176.     bne    Err_NoComLineSpace
  177.     cmp.b    #"p",(a0)
  178.     beq    FromPCMode
  179.     cmp.b    #"P",(a0)
  180.     beq    ToPCMode
  181.     cmp.b    #"s",(a0)
  182.     beq    FromSF7Mode
  183.     cmp.b    #"S",(a0)
  184.     beq    ToSF7Mode
  185.     cmp.b    #"u",(a0)
  186.     beq    ToUpCaseMode
  187.     cmp.b    #"l",(a0)
  188.     beq    ToLowCaseMode
  189.     cmp.b    #"a",(a0)
  190.     beq    AutoMode
  191.     cmp.b    #"n",(a0)
  192.     beq    ModeToNull
  193.     cmp.b    #"o",(a0)
  194.     beq    ModeToOnlyASCII
  195.     bra    Err_BadMode
  196.  
  197. CheckOption:
  198.     cmp.b    #"e",1(a0)
  199.     beq    Opt_MakeEOLs
  200.     cmp.b    #"n",1(a0)
  201.     beq    Opt_NoCutSpace
  202.     cmp.b    #"?",1(a0)
  203.     beq    Credits
  204.     cmp.b    #"t",1(a0)
  205.     beq    Opt_TabConv
  206.     cmp.b    #"s",1(a0)
  207.     beq    Opt_SpaceConv
  208.     cmp.b    #"q",1(a0)
  209.     beq    Opt_QuietMode
  210.     cmp.b    #"b",1(a0)
  211.     beq    Opt_NoBufferMode
  212.     bra    Err_BadComLine
  213.  
  214. Opt_NoCutSpace:
  215.     tst.b    Size_MakeEOLs
  216.     bne    Err_BadLogic
  217.     move.b    #1,Mode_NoCutSpace
  218.     addq.l    #2,a0
  219.     bra    Opt_Next
  220.  
  221. Opt_TabConv:
  222.     tst.b    TabSize
  223.     bne    Err_BadLogic
  224.     move.b    2(a0),d0
  225.     cmp.b    #" ",d0
  226.     beq    Opt_TabConv1
  227.     sub.b    #"0",d0
  228.     cmp.b    #9,d0
  229.     bhi    Err_BadComLine
  230.     cmp.b    #1,d0
  231.     bcs    Err_BadComLine
  232.     bra    Opt_BothConv
  233.  
  234. Opt_TabConv1:
  235.     move.b    #8,d0
  236.     subq.l    #1,a0
  237.     bra    Opt_BothConv
  238.  
  239. Opt_SpaceConv:
  240.     tst.b    TabSize
  241.     bne    Err_BadLogic
  242.     tst.b    Size_MakeEOLs
  243.     bne    Err_BadLogic
  244.     move.b    2(a0),d0
  245.     cmp.b    #" ",d0
  246.     beq    Opt_SpaceConv1
  247.     sub.b    #"0",d0
  248.     cmp.b    #9,d0
  249.     bhi    Err_BadComLine
  250.     cmp.b    #2,d0            ; No sense in converting to one tab
  251.     bcs    Err_BadComLine        ; so 2 is the lower limit.
  252.     move.b    d0,SpaceSize
  253.     bra    Opt_BothConv
  254.  
  255. Opt_SpaceConv1:
  256.     move.b    #8,d0
  257.     move.b    d0,SpaceSize
  258.     subq.l    #1,a0
  259.  
  260. Opt_BothConv:
  261.     move.b    d0,TabSize
  262.     addq.l    #3,a0
  263.     bra    Opt_Next
  264.  
  265. Opt_QuietMode:
  266.     move.b    #1,Mode_Quiet
  267.     addq.l    #2,a0
  268.     bra    Opt_Next
  269.  
  270. *** CODE CLEANED UNTIL HERE ***
  271.  
  272. Opt_MakeEOLs:
  273.     tst.b    SpaceSize
  274.     bne    Err_badlogic
  275.     move.b    2(a0),d0
  276.     cmp.b    #" ",d0
  277.     beq    Err_BadComLine
  278.     sub.b    #"0",d0
  279.     cmp.b    #9,d0
  280.     bhi    Err_BadComLine
  281.     cmp.b    #1,d0
  282.     bcs    Err_BadComLine
  283.     move.b    3(a0),d1
  284.     cmp.b    #" ",d1
  285.     beq    Opt_MakeEOLs1
  286.     sub.b    #"0",d1
  287.     cmp.b    #9,d1
  288.     bhi    Err_BadComLine
  289.     cmp.b    #0,d1
  290.     bcs    Err_BadComLine
  291.     ext.w    d0
  292.     mulu    #10,d0
  293.     add.b    d1,d0
  294.     move.b    d0,size_MakeEOLs
  295.     addq.l    #4,a0
  296.     bra    Opt_Next
  297.  
  298. Opt_MakeEOLs1:
  299.     move.b    d0,size_MakeEOLs
  300.     addq.l    #3,a0
  301.     bra    Opt_Next
  302.  
  303. Opt_nobufferMode:
  304.     move.b    #1,Mode_nobuffer
  305.     addq.l    #2,a0
  306.  
  307. Opt_Next:
  308.     cmp.b    #" ",(a0)
  309.     bne    Err_BadComLine
  310.     bsr    skipspace
  311.     cmp.l    #0,a0
  312.     beq    Err_BadComLine
  313.     bra    parsestart
  314.  
  315. frompcMode:
  316.     move.b    #1,Mode
  317.     move.l    #table_frompc,table
  318.     bra    nameparse
  319.  
  320. fromsf7Mode:
  321.     move.b    #2,Mode
  322.     move.l    #table_fromsf7,table
  323.     bra    nameparse
  324.  
  325. tosf7Mode:
  326.     move.b    #-2,Mode
  327.     move.l    #table_tosf7,table
  328.     bra    nameparse
  329.  
  330. topcMode:
  331.     move.b    #-1,Mode
  332.     move.l    #table_topc,table
  333.     bra    nameparse
  334.  
  335. toupcaseMode:
  336.     move.b    #3,Mode
  337.     bra    nameparse
  338.  
  339. tolowcaseMode:
  340.     move.b    #4,Mode
  341.     bra    nameparse
  342.  
  343. autoMode:
  344.     tst.b    Mode_nobuffer        ; Mode_nobuffer=0? means we have buffer
  345.     bne    Err_needbuffer        ; if not
  346.     move.b    #6,Mode
  347.     bra    nameparse
  348.  
  349. ModeToNull:
  350.     move.b    #5,Mode
  351.     move.l    #table_null,table
  352.     bra    NameParse
  353.  
  354. ModeToOnlyASCII:
  355.     move.b    #7,Mode
  356.     move.l    #Table_Null,Table
  357.  
  358. nameparse:
  359.     addq.l    #1,a0            ; one after Mode
  360.     bsr    SkipSpace
  361.     cmp.l    #0,a0
  362.     beq    Err_BadComLine
  363.     move.l    a0,sourcenamestart
  364.     bsr    findend
  365.     movem.l    a0,-(a7)        ; push sourcename end in stack
  366.     addq.l    #1,a0            ; find the length for sourcename
  367.     sub.l    sourcenamestart,a0
  368.     move.l    a0,sourcenamelen
  369.  
  370.     move.l    sourcenamestart,a0
  371.     move.l    #sourcename,a1
  372.     move.l    sourcenamelen,d0
  373.     bsr    copyname
  374.     clr.b    (a1)
  375.  
  376.     move.l    #SourceName,d1        ; Now let's try to find the source
  377.     move.l    #ACCESS_READ,d2
  378.     move.l    _DosBase,a6
  379.     jsr    _LVOLock(a6)
  380.     move.l    d0,SourceLock
  381.     beq    CheckAllNames        ; If no lock, try different suffixes
  382.  
  383. CheckFile:
  384.     move.l    SourceLock,d1
  385.     move.l    #FIB,d2
  386.     move.l    _DosBase,a6
  387.     jsr    _LVOExamine(a6)
  388.     movem.l    d0,-(a7)        ; Save result code
  389.  
  390.     move.l    SourceLock,d1
  391.     move.l    _DosBase,a6
  392.     jsr    _LVOUnLock(a6)
  393.  
  394.     movem.l    (a7)+,d0
  395.     tst.l    d0            ; Boolean
  396.     beq    Err_SourceCorrupt    ; 0 means error
  397.     lea    FIB,a0
  398.     cmp.l    #0,fib_DirEntryType(a0)    ; Dir or a file?
  399.     bpl    Err_SourceIsDir        ; >=0 means directory, error
  400.     move.l    fib_Size(a0),SourceLen
  401.     move.l    #fib_FileName,a1
  402.     add.l    a0,a1
  403.     move.l    #RealSourceName,a0
  404.     exg    a0,a1
  405.     bsr    CopyUntilNull
  406.  
  407.     movem.l    (a7)+,a0        ; Get SourceName's end from stack
  408.     addq.l    #1,a0
  409.     cmp.l    CommandEnd,a0
  410.     beq    NoDest
  411.  
  412.     bsr    SkipSpace
  413.     move.l    a0,DestNameStart    ; If 0, go NoDest
  414.     beq    NoDest
  415.     bsr    FindEnd
  416.     addq.l    #1,a0            ; Add 1 to DestName end, and get
  417.     sub.l    DestNameStart,a0    ; DestNameLen in a0
  418.     move.l    a0,d0
  419.     move.l    d0,DestNameLen
  420.  
  421.     move.l    DestNameStart,a0
  422.     lea    DestName,a1
  423.     bsr    CopyName
  424.  
  425.     move.l    #DestName,d1        ; Now let's try to find the dest
  426.     move.l    #ACCESS_READ,d2
  427.     move.l    _DosBase,a6
  428.     jsr    _LVOLock(a6)
  429.     move.l    d0,DestLock
  430.     beq    OpenFiles        ; If no lock, we'll have a file.
  431.  
  432.     move.l    DestLock,d1        ; Otherwise check it
  433.     move.l    #FIB,d2
  434.     move.l    _DosBase,a6
  435.     jsr    _LVOExamine(a6)
  436.     movem.l    d0,-(a7)        ; Save result code
  437.  
  438.     move.l    DestLock,d1
  439.     move.l    _DosBase,a6
  440.     jsr    _LVOUnLock(a6)
  441.  
  442.     movem.l    (a7)+,d0
  443.     tst.l    d0            ; Boolean
  444.     beq    Err_DestCorrupt        ; 0 means error
  445.  
  446.     lea    FIB,a0
  447.     cmp.l    #0,fib_DirEntryType(a0)    ; Dir or a file?
  448.     bpl    DestIsDir        ; >=0 means directory
  449.  
  450.     bra    OpenFiles
  451.  
  452. DestIsDir:
  453.     lea    DestName,a0        ; Get DestName
  454.     add.l    DestNameLen,a0        ; Go to the end
  455.     cmp.b    #":",-1(a0)        ; If the last char is ":",
  456.     beq    LinkName
  457.     cmp.b    #"/",-1(a0)        ; or "/" just link the sourcename to it.
  458.     beq    LinkName
  459.     tst.b    -1(a0)
  460.     beq    LinkName
  461.     move.b    #"/",(a0)+
  462.  
  463. LinkName:
  464.     move.l    #RealSourceName,a1
  465.     exg    a0,a1
  466.     bsr    CopyUntilNull
  467.     bra    OpenFiles
  468.  
  469. NoDest:
  470.     move.l    SourceNameStart,a0
  471.     move.l    SourceNameLen,d0
  472.     lea    DestName,a1
  473.     bsr    CopyName
  474.  
  475.     tst.b    Mode_NoBuffer        ; If we have a buffer, no suffix, go
  476.     beq    OpenFiles1        ; OpenFiles1
  477.  
  478.     cmp.b    #-1,Mode
  479.     beq    PCSuffix
  480.     cmp.b    #-2,Mode
  481.     beq    SF7Suffix
  482.  
  483. AmigaSuffix:
  484.     lea    Text_AmigaSuf,a0
  485.     moveq    #4-1,d0
  486.     bra    AddSuffix
  487.  
  488. PCSuffix:
  489.     lea    Text_PCSuf,a0
  490.     moveq    #3-1,d0
  491.     bra    AddSuffix
  492.  
  493. SF7Suffix:
  494.     lea    Text_SF7Suf,a0
  495.     moveq    #4-1,d0
  496.  
  497. AddSuffix:
  498.     move.b    (a0)+,(a1)+
  499.     dbf    d0,AddSuffix
  500.  
  501. OpenFiles:
  502.     clr.b    (a1)            ; End of filename
  503.  
  504.     tst.b    Mode_NoBuffer
  505.     beq    OpenFiles1
  506.  
  507.     move.l    #SourceName,d1
  508.     move.l    #MODE_OLDFILE,d2
  509.     move.l    _DosBase,a6
  510.     jsr    _LVOOpen(a6)
  511.     moveq    #1,d7
  512.     move.l    d0,SourceHandle
  513.     beq    CodeError
  514.  
  515.     move.l    SourceHandle,d1
  516.     move.l    #SourceBuf,d2
  517.     move.l    #4,d3
  518.     move.l    _DosBase,a6
  519.     jsr    _LVORead(a6)
  520.     cmp.l    #4,d0
  521.     bne    OpenFiles3
  522.  
  523.     move.l    SourceBuf,d0
  524.     cmp.l    #"PP20",d0
  525.     beq    Err_PowerPacked
  526.  
  527. OpenFiles3:
  528.     move.l    SourceHandle,d1        ; seek back to the beginning of file
  529.     sub.l    d2,d2
  530.     moveq    #OFFSET_BEGINNING,d3
  531.     move.l    _DosBase,a6
  532.     jsr    _LVOSeek(a6)
  533.  
  534.     move.l    #DestName,d1
  535.     move.l    #MODE_NEWFILE,d2
  536.     move.l    _DosBase,a6
  537.     jsr    _LVOOpen(a6)
  538.     move.l    d0,DestHandle
  539.     beq    Err_NoDest
  540.  
  541.     bra    ReadBlock
  542.  
  543. CheckAllNames:
  544.     lea    SourceName,a0
  545.  
  546. CAN_NameLen:
  547.     tst.b    (a0)+            ; Loop until null found = end
  548.     bne    CAN_NameLen
  549.     subq.l    #1,a0
  550.     move.l    a0,a2            ; Where to add suffixes in a2
  551.     lea    Text_Suffixes,a1
  552.  
  553. CAN_TrySuffix:
  554.     move.b    (a1)+,(a0)+
  555.     bne    CAN_TrySuffix        ; Copy until null moved
  556.     movem.l    a0-a2,-(a7)
  557.  
  558.     move.l    #SourceName,d1
  559.     move.l    #ACCESS_READ,d2
  560.     move.l    _DosBase,a6
  561.     jsr    _LVOLock(a6)
  562.     move.l    d0,SourceLock
  563.     beq    CAN_NoSuccess        ; No lock, try next suffix
  564.     movem.l    (a7)+,a0-a2
  565.     bra    CheckFile
  566.     
  567. CAN_NoSuccess:
  568.     movem.l    (a7)+,a0-a2
  569.     cmp.b    #$ff,(a1)        ; $ff = End of suffixes
  570.     beq    Err_NoSource        ; If so, couldn't find file
  571.     move.l    a2,a0            ; Suffixplace back in a0
  572.     bra    CAN_TrySuffix        ; And try again
  573.  
  574. OpenFiles1:
  575.     lea    SourceLenASCII,a0    ; Make a string of the file length
  576.     move.l    SourceLen,d0
  577.     bsr    Num2ASCII
  578.     move.l    a0,SourceLenASCIIAddr
  579.     move.l    d0,SourceLenASCIILen
  580.  
  581.     move.l    #SourceName,d1
  582.     move.l    #MODE_OLDFILE,d2
  583.     move.l    _DosBase,a6
  584.     jsr    _LVOOpen(a6)
  585.     moveq    #2,d7
  586.     move.l    d0,SourceHandle
  587.     beq    CodeError
  588.  
  589.     move.l    SourceHandle,d1
  590.     move.l    #SourceBuf,d2
  591.     move.l    #4,d3
  592.     move.l    _DosBase,a6
  593.     jsr    _LVORead(a6)
  594.     cmp.l    #4,d0
  595.     bne    OpenFiles2
  596.  
  597.     move.l    SourceBuf,d0
  598.     cmp.l    #"PP20",d0
  599.     beq    Err_PowerPacked
  600.  
  601. OpenFiles2:
  602.     move.l    SourceHandle,d1        ; seek back to the beginning of file
  603.     sub.l    d2,d2
  604.     moveq    #OFFSET_BEGINNING,d3
  605.     move.l    _DosBase,a6
  606.     jsr    _LVOSeek(a6)
  607.  
  608.     move.l    SourceLen,d0
  609.     moveq    #MEMF_PUBLIC,d1
  610.     move.l    ExecBase,a6
  611.     jsr    _LVOAllocMem(a6)
  612.     move.l    d0,SourcePointer
  613.     beq    Err_NoMem
  614.  
  615. ReadFile:
  616.     move.l    SourceHandle,d1
  617.     move.l    SourcePointer,d2
  618.     add.l    ReadBytes,d2
  619.     move.l    #10240,d3
  620.     move.l    _DosBase,a6
  621.     jsr    _LVORead(a6)
  622.     cmp.l    #-1,d0
  623.     beq    Err_ReadFail
  624.     add.l    d0,ReadBytes
  625.     movem.l    d0,-(a7)
  626.     tst.b    Mode_Quiet
  627.     bne    TestRead
  628.  
  629.     move.l    #Text_Read,d2
  630.     moveq    #14,d3
  631.     bsr    PrintText
  632.  
  633.     lea    ReadASCII,a0
  634.     move.l    ReadBytes,d0
  635.     bsr    Num2ASCII
  636.  
  637.     move.l    a0,ReadASCIIAddr
  638.     move.l    d0,ReadASCIILen
  639.     move.l    a0,d2
  640.     move.l    d0,d3
  641.     bsr    PrintText
  642.  
  643.     move.l    #Text_Slash,d2
  644.     moveq    #1,d3
  645.     bsr    PrintText
  646.  
  647.     move.l    SourceLenASCIIAddr,d2
  648.     move.l    SourceLenASCIILen,d3
  649.     bsr    PrintText
  650.  
  651.     move.l    #Text_CR,d2
  652.     moveq    #1,d3
  653.     bsr    PrintText
  654.  
  655. TestRead:
  656.     movem.l    (a7)+,d0
  657.     tst.l    d0            ; = number of bytes read
  658.     beq    ReadFinished
  659.  
  660.     sub.l    d0,d0
  661.     sub.l    d1,d1
  662.     move.l    ExecBase,a6
  663.     jsr    _LVOSetSignal(a6)
  664.  
  665.     btst    #SIGBREAKB_CTRL_C,d0    ; check if ^C was pressed
  666.     bne    BreakPressed
  667.  
  668.     bra    ReadFile
  669.  
  670. ReadFinished:
  671.     move.l    ReadBytes,LeftBytes
  672.  
  673.     move.l    SourceHandle,d1
  674.     move.l    _DosBase,a6
  675.     jsr    _LVOClose(a6)
  676.  
  677.     cmp.b    #6,Mode            ; AutoMode on?
  678.     beq    DetectMode
  679.  
  680. ReadFinished1:
  681.     move.l    #DestName,d1
  682.     move.l    #MODE_NEWFILE,d2
  683.     move.l    _DosBase,a6
  684.     jsr    _LVOOpen(a6)
  685.     move.l    d0,DestHandle
  686.     beq    Err_NoDest
  687.  
  688.     bra    MoreData
  689.  
  690. DetectMode:
  691.     move.l    #Text_Checking,d2
  692.     moveq    #34,d3
  693.     bsr    PrintText
  694.  
  695.     sub.l    d2,d2
  696.     sub.l    d3,d3
  697.     sub.l    d4,d4
  698.     move.l    SourcePointer,a0
  699.     cmp.l    #10240,LeftBytes
  700.     bcs    DetectMode1
  701.     move.l    #10240-1,d1
  702.  
  703. DetectMode2:
  704.     move.b    (a0)+,d0
  705.     cmp.b    #"{",d0
  706.     beq    DM_sf7
  707.     cmp.b    #"[",d0
  708.     beq    DM_sf7
  709.     cmp.b    #"|",d0
  710.     beq    DM_sf7
  711.     cmp.b    #"\",d0
  712.     beq    DM_sf7
  713.  
  714.     cmp.b    #"ä",d0
  715.     beq    DM_Amy
  716.     cmp.b    #"Ä",d0
  717.     beq    DM_Amy
  718.     cmp.b    #"ö",d0
  719.     beq    DM_Amy
  720.     cmp.b    #"Ö",d0
  721.     beq    DM_Amy
  722.  
  723.     cmp.b    #$84,d0
  724.     beq    DM_PC
  725.     cmp.b    #$8e,d0
  726.     beq    DM_PC
  727.     cmp.b    #$94,d0
  728.     beq    DM_PC
  729.     cmp.b    #$99,d0
  730.     beq    DM_PC
  731.  
  732.     cmp.b    #13,d0
  733.     beq    DM_foreign
  734.  
  735. DetectMode3:
  736.     dbf    d1,DetectMode2
  737.  
  738.     cmp.l    d2,d3
  739.     beq    SameWarn1
  740.     cmp.l    d2,d4
  741.     beq    SameWarn1
  742.     cmp.l    d3,d4
  743.     beq    SameWarn2
  744.  
  745. DetectMode4:
  746.     movem.l    d2-d4,-(a7)
  747.     move.l    #Text_Uses,d2
  748.     moveq    #14,d3
  749.     bsr    PrintText
  750.     movem.l    (a7)+,d2-d4
  751.  
  752.     cmp.l    d2,d3            ; SF7 or Amy
  753.     bhi    DM_NotSF7
  754.  
  755. DM_NotAmy:
  756.     cmp.l    d2,d4            ; SF7 or PC
  757.     bhi    DM_MakePC
  758.     bra    DM_MakeSF7
  759.  
  760. DM_NotSF7:
  761.     cmp.l    d3,d4            ; Amy or PC
  762.     bhi    DM_MakePC
  763.  
  764. DM_MakeAmy:
  765.     move.b    #5,Mode
  766.     move.l    #Table_Null,Table
  767.  
  768.     move.l    #Text_NullMode,d2
  769.     moveq    #10,d3
  770.     bsr    PrintText
  771.  
  772.     bra    ReadFinished1    
  773.  
  774. DM_MakePC:
  775.     move.b    #1,Mode
  776.     move.l    #Table_FromPC,Table
  777.  
  778.     move.l    #Text_PCMode,d2
  779.     moveq    #7,d3
  780.     bsr    PrintText
  781.  
  782.     bra    ReadFinished1
  783.  
  784. DM_MakeSF7:
  785.     move.b    #2,Mode
  786.     move.l    #Table_FromSF7,Table
  787.  
  788.     move.l    #Text_SF7Mode,d2
  789.     moveq    #8,d3
  790.     bsr    PrintText
  791.  
  792.     bra    ReadFinished1
  793.  
  794. SameWarn1:
  795.     cmp.l    d3,d4
  796.     beq    Err_SameProbability
  797.     bra    DetectMode4
  798.  
  799. SameWarn2:
  800.     cmp.l    d2,d3
  801.     beq    Err_SameProbability
  802.     bra    DetectMode4
  803.  
  804. DetectMode1:
  805.     move.l    LeftBytes,d1
  806.     subq.l    #1,d1
  807.     bra    DetectMode2
  808.  
  809. DM_SF7:
  810.     addq.l    #1,d2
  811.     bra    DetectMode3
  812.  
  813. DM_Amy:
  814.     addq.l    #1,d3
  815.     bra    DetectMode3
  816.  
  817. DM_PC:
  818.     addq.l    #1,d4
  819.     bra    DetectMode3
  820.  
  821. DM_Foreign:
  822.     addq.l    #1,d2
  823.     addq.l    #1,d4
  824.     bra    DetectMode3
  825.  
  826. ReadBlock:
  827.     tst.b    Mode_NoBuffer
  828.     beq    MoreData
  829.  
  830.     move.l    SourceHandle,d1
  831.     move.l    SourcePointer,d2
  832.     move.l    #1024,d3
  833.     move.l    _DosBase,a6
  834.     jsr    _LVORead(a6)
  835.     cmp.l    #-1,d0
  836.     beq    Err_ReadFail
  837.     add.l    d0,ReadBytes
  838.     move.l    d0,d1
  839.     beq    CloseFiles        ; ReadBytes = 0 - Quit
  840.     subq.l    #1,d1            ; Counter always one less than real
  841.     sub.l    d2,d2            ; Bytes to be written zeroed
  842.     lea    SourceBuf,a0
  843.     lea    DestBuf,a1
  844.     bra    MoreCharacters
  845.  
  846. MoreData:
  847.     tst.l    LeftBytes
  848.     beq    CloseFiles
  849.     sub.l    d2,d2
  850.     cmp.l    #1024,LeftBytes
  851.     bls    MoreData1
  852.     sub.l    #1024,LeftBytes
  853.     move.l    SourcePointer,a0
  854.     add.l    InputBytes,a0
  855.     add.l    #1024,InputBytes
  856.     move.l    #1024-1,d1
  857.     lea    DestBuf,a1
  858.     bra    MoreCharacters
  859.  
  860. MoreData1:
  861.     move.l    LeftBytes,d0
  862.     clr.l    LeftBytes
  863.     move.l    SourcePointer,a0
  864.     add.l    InputBytes,a0
  865.     add.l    d0,InputBytes
  866.     subq.l    #1,d0
  867.     move.l    d0,d1
  868.     lea    DestBuf,a1
  869.  
  870. MoreCharacters:
  871.     move.b    (a0)+,d0
  872.  
  873.     tst.b    Mode            ; ToSF7 = -2, ToPC = -1
  874.     bmi    Translate        ; Lower than 0
  875.  
  876.     cmp.b    #2,Mode            ; FromSF7
  877.     beq    translate
  878.     cmp.b    #3,Mode            ; Upcase
  879.     beq    toupcase
  880.     cmp.b    #4,Mode            ; Lowcase
  881.     beq    tolowcase
  882.     cmp.b    #5,Mode            ; Null
  883.     beq    translate
  884.     cmp.b    #7,Mode            ; OnlyASCII
  885.     beq    OnlyASCIIMode
  886.  
  887. FromPC:
  888.     cmp.b    #" ",d0
  889.     bcs    PC_Translate
  890.     cmp.b    #"~",d0
  891.     bhi    PC_Translate
  892.     bra    NextChar
  893.  
  894. PC_Translate:
  895.     tst.b    d0            ; The two characters not in the table
  896.     beq    NoChar
  897.     cmp.b    #$1a,d0
  898.     beq    NoChar
  899.     cmp.b    #13,d0            ; CRs out!
  900.     beq    NoChar
  901.     cmp.b    #$80,d0
  902.     bcs    NextChar
  903.     lea    Table_FromPC,a3
  904.     sub.b    #$80,d0
  905.     ext.w    d0
  906.     ext.l    d0
  907.     add.l    d0,a3
  908.     move.b    (a3),d0
  909.     beq    NoChar
  910.     bra    CutSpace
  911.  
  912. translate:
  913.     move.l    table,a3
  914.     tst.b    d0
  915.     beq    NoChar
  916.  
  917. translate1:
  918.     move.w    (a3)+,d3
  919.     beq    NextChar        ; 0 = End of table
  920.     cmp.b    d3,d0
  921.     beq    translate2
  922.     bra    translate1
  923.  
  924. translate2:
  925.     lsr.w    #8,d3
  926.     move.b    d3,d0            ; If 0 = No char
  927.     beq    nochar
  928.  
  929. NextChar:
  930.     bra    CutSpace
  931.  
  932. checknormal:
  933.     move.b    d0,(a1)+
  934.     addq.l    #1,d2
  935.     addq.w    #1,col
  936.  
  937. NoChar:
  938.     dbf    d1,MoreCharacters
  939.  
  940.     move.l    DestHandle,d1        ; Write the converted data
  941.     move.l    d2,d3
  942.     add.l    d2,WrittenBytes
  943.     move.l    #DestBuf,d2
  944.     move.l    _DosBase,a6
  945.     jsr    _LVOWrite(a6)
  946.     cmp.l    #-1,d0
  947.     beq    Err_WriteFail
  948.  
  949.     sub.l    d0,d0
  950.     sub.l    d1,d1
  951.     move.l    ExecBase,a6
  952.     jsr    _LVOSetSignal(a6)
  953.  
  954.     btst    #SIGBREAKB_CTRL_C,d0    ; check if ^C was pressed
  955.     bne    EndProgram5
  956.  
  957.     tst.b    Mode_Quiet
  958.     bne    ReadBlock
  959.  
  960.     tst.b    Mode_NoBuffer
  961.     beq    AlternateOutput
  962.  
  963.     move.l    #Text_Input,d2
  964.     moveq    #15,d3
  965.     bsr    PrintText
  966.  
  967.     lea    NumberBuf,a0
  968.     move.l    ReadBytes,d0
  969.     bsr    Num2ASCII
  970.  
  971.     move.l    a0,d2
  972.     move.l    d0,d3
  973.     bsr    PrintText
  974.  
  975.     move.l    #Text_Output,d2
  976.     moveq    #18,d3
  977.     bsr    PrintText
  978.  
  979.     lea    numberbuf,a0
  980.     move.l    writtenbytes,d0
  981.     bsr    num2ascii
  982.  
  983.     move.l    a0,d2
  984.     move.l    d0,d3
  985.     bsr    PrintText
  986.  
  987.     move.l    #Text_CR,d2
  988.     moveq    #1,d3
  989.     bsr    PrintText
  990.  
  991.     bra    ReadBlock
  992.  
  993. alternateoutput:
  994.     move.l    #Text_converted,d2
  995.     moveq    #19,d3
  996.     bsr    PrintText
  997.  
  998.     lea    numberbuf,a0
  999.     move.l    inputbytes,d0
  1000.     bsr    num2ascii
  1001.  
  1002.     move.l    a0,d2
  1003.     move.l    d0,d3
  1004.     bsr    PrintText
  1005.  
  1006.     move.l    #Text_slash,d2
  1007.     moveq    #1,d3
  1008.     bsr    PrintText
  1009.  
  1010.     move.l    readasciiaddr,d2
  1011.     move.l    readasciilen,d3
  1012.     bsr    PrintText
  1013.  
  1014.     move.l    #Text_cr,d2
  1015.     moveq    #1,d3
  1016.     bsr    PrintText
  1017.  
  1018.     bra    readblock
  1019.  
  1020. cutspace:
  1021.     move.l    spacepointer,a2
  1022.     cmp.b    #" ",d0
  1023.     beq    addspace
  1024.     cmp.b    #9,d0            ; tab
  1025.     beq    addtab
  1026.     bsr    addEOL            ; check if char is 10, and add EOLs
  1027.  
  1028.     tst.b    Mode_nocutspace
  1029.     bne    cutspace2
  1030.  
  1031.     cmp.b    #10,d0            ; lf
  1032.     beq    cutspaces
  1033.  
  1034. cutspace1:                ; a character which is not a space,
  1035.     tst.b    prespace        ; tab or a linefeed.  Trigger things
  1036.     bne    insertprespace
  1037.     tst.l    tabs
  1038.     bne    linkspaces
  1039.  
  1040. cutspace3:
  1041.     tst.l    spacenumber
  1042.     bne    linkspaces2
  1043.  
  1044. cutspace4:
  1045.     cmp.b    #10,d0            ; has been buffered, nochar
  1046.     beq    nochar
  1047.     tst.b    Mode_nocutspace
  1048.     beq    testforspace
  1049.  
  1050. linkEOLs:
  1051.     bsr    insertEOLs        ; insert any EOLs currently in buffer
  1052.  
  1053.     cmp.b    #" ",d0            ; if the char was a space or a tab,
  1054.     beq    nochar            ; we don't want it to pass straight
  1055.     cmp.b    #9,d0            ; in the buffer.  otherwise yes.
  1056.     beq    nochar
  1057.     bra    checknormal
  1058.  
  1059. testforspace:
  1060.     cmp.b    #" ",d0            ; if cutspace is on, spaces and tabs
  1061.     beq    nochar            ; don't automatically trigger EOLs
  1062.     cmp.b    #9,d0            ; in: they will be triggered when
  1063.     beq    nochar            ; the tabs and spaces get triggered
  1064.     bra    linkEOLs
  1065.  
  1066. cutspace2:
  1067.     cmp.b    #10,d0
  1068.     bne    cutspace1
  1069.     clr.w    col
  1070.     bra    cutspace1
  1071.  
  1072. addspace:
  1073.     move.b    d0,(a2)+
  1074.     move.l    a2,spacepointer
  1075.     addq.l    #1,spacenumber
  1076.     addq.w    #1,col
  1077.     bra    checkconvspace
  1078.  
  1079. addtab:
  1080.     move.b    TabSize,d4        ; if TabSize is zero, just add it in
  1081.     bne    tabconv            ; spacebuffer
  1082.     bra    addspace
  1083.  
  1084. tabconv:
  1085.     ext.w    d4            ; Convert TabSize
  1086.     ext.l    d4
  1087.     move.w    Col,d3            ; Get current column
  1088.     ext.l    d3
  1089.     divu    d4,d3            ; Divide column with TabSize -> we get
  1090.     swap    d3            ; the offset from last tab as characters
  1091.     sub.w    d3,d4            ; Get the # of spaces to the next tab
  1092.     add.l    d4,SpaceNumber
  1093.     add.w    d4,col
  1094.     subq.w    #1,d4
  1095.     move.b    #" ",d0
  1096.  
  1097. TabConv1:
  1098.     move.b    d0,(a2)+        ; Copy the spaces in the buffer
  1099.     dbf    d4,TabConv1
  1100.     move.l    a2,SpacePointer        ; And save the space buf pointer
  1101.  
  1102. CheckConvSpace:
  1103.     tst.b    SpaceSize        ; SpaceSize=0 means no space2tab
  1104.     beq    cutspace4
  1105.     cmp.l    #1,spacenumber        ; if spacenumber<1, skip
  1106.     bcs    cutspace4
  1107.     move.w    col,d5
  1108.     ext.l    d5
  1109.     move.l    spacenumber,d3
  1110.     move.b    SpaceSize,d4
  1111.     ext.w    d4
  1112.     ext.l    d4
  1113.  
  1114.     divu    d4,d5            ; if column is divisible by SpaceSize,
  1115.     swap    d5            ; go to "foundconvspace"
  1116.     tst.w    d5
  1117.     beq    foundconvspace
  1118.     bra    cutspace4        ; otherwise just continue
  1119.  
  1120. foundconvspace:
  1121.     cmp.l    #1,spacenumber        ; if only one space is won, don't
  1122.     beq    foundconvspace2
  1123.     move.l    #spacebuf,spacepointer
  1124.     addq.l    #1,tabs
  1125.     sub.l    d4,spacenumber
  1126.     bmi    foundconvspace1
  1127.     bra    cutspace4
  1128.  
  1129. foundconvspace1:
  1130.     clr.l    spacenumber
  1131.     bra    cutspace4
  1132.  
  1133. foundconvspace2:
  1134.     move.b    #1,prespace
  1135.     move.l    #spacebuf,spacepointer
  1136.     clr.l    spacenumber
  1137.     bra    cutspace4
  1138.  
  1139. cutspaces:
  1140.     clr.b    PreSpace
  1141.     clr.l    spacenumber
  1142.     clr.l    tabs
  1143.     move.l    #spacebuf,spacepointer
  1144.     clr.w    col
  1145.     bra    nochar
  1146.  
  1147. AddEOL:
  1148.     cmp.b    #10,d0
  1149.     beq    addEOL1
  1150.     rts
  1151.  
  1152. addEOL1:
  1153.     addq.l    #1,EOLs
  1154.     rts
  1155.  
  1156. linkspaces:
  1157.     tst.b    Mode_nocutspace
  1158.     bne    linkspaces4
  1159.     bsr    insertEOLs
  1160.  
  1161. linkspaces4:
  1162.     move.l    tabs,d3
  1163.     clr.l    tabs
  1164.     add.l    d3,d2            ; tabs -> bytes to be written
  1165.     subq.l    #1,d3
  1166.  
  1167. linkspaces1:
  1168.     move.b    #9,(a1)+
  1169.     dbf    d3,linkspaces1
  1170.     bra    cutspace3
  1171.  
  1172. linkspaces2:
  1173.     tst.b    Mode_nocutspace
  1174.     bne    linkspaces5
  1175.     bsr    insertEOLs
  1176.  
  1177. linkspaces5:
  1178.     move.l    spacenumber,d3
  1179.     tst.b    size_MakeEOLs
  1180.     bne    ls_checkMakeEOLs
  1181. linkspaces6:
  1182.     add.l    d3,d2            ; spaces -> bytes to be written
  1183.     subq.l    #1,d3
  1184.     lea    spacebuf,a2
  1185.     move.l    a2,spacepointer
  1186.  
  1187. linkspaces3:
  1188.     move.b    (a2)+,(a1)+
  1189.     dbf    d3,linkspaces3
  1190.     clr.l    spacenumber
  1191.     bra    cutspace4
  1192.  
  1193. LS_CheckMakeEOLs:
  1194.     cmp.b    size_MakeEOLs,d3
  1195.     bcs    linkspaces6
  1196.     addq.l    #1,d2
  1197.     move.b    #10,(a1)+
  1198.     clr.l    spacenumber
  1199.     move.l    #spacebuf,spacepointer
  1200.     bra    cutspace4
  1201.  
  1202. insertprespace:
  1203.     clr.b    prespace
  1204.     move.b    #" ",(a1)+
  1205.     addq.l    #1,d2
  1206.     bra    cutspace1
  1207.  
  1208. toupcase:
  1209.     cmp.b    #"ä",d0
  1210.     beq    Amy_upae
  1211.     cmp.b    #"ö",d0
  1212.     beq    Amy_upoe
  1213.     cmp.b    #"a",d0
  1214.     bcs    Nextchar
  1215.     cmp.b    #"z",d0
  1216.     bhi    Nextchar
  1217.  
  1218.     and.b    #%11011111,d0
  1219.     bra    Nextchar
  1220.  
  1221. tolowcase:
  1222.     cmp.b    #"Ä",d0
  1223.     beq    Amy_lowae
  1224.     cmp.b    #"Ö",d0
  1225.     beq    Amy_lowoe
  1226.     cmp.b    #"A",d0
  1227.     bcs    Nextchar
  1228.     cmp.b    #"Z",d0
  1229.     bhi    Nextchar
  1230.  
  1231.     or.b    #%100000,d0
  1232.     bra    Nextchar
  1233.  
  1234. OnlyASCIIMode:
  1235.     btst    #7,d0
  1236.     bne    NoChar
  1237.     bra    Translate
  1238.  
  1239. Amy_lowae:
  1240.     move.b    #"ä",d0
  1241.     bra    Nextchar
  1242.  
  1243. Amy_lowoe:
  1244.     move.b    #"ö",d0
  1245.     bra    Nextchar
  1246.  
  1247. Amy_upae:
  1248.     move.b    #"Ä",d0
  1249.     bra    Nextchar
  1250.  
  1251. Amy_upoe:
  1252.     move.b    #"Ö",d0
  1253.     bra    Nextchar
  1254.  
  1255. closefiles:
  1256.     tst.b    Mode_nobuffer
  1257.     beq    freebuffer
  1258.     bsr    closesource
  1259.     bra    closefiles3
  1260.  
  1261. freebuffer:
  1262.     bsr    freememory
  1263.  
  1264. closefiles3:
  1265.     bsr    closedest
  1266.  
  1267.     move.l    #Text_final,d2
  1268.     moveq    #26,d3
  1269.     bsr    PrintText
  1270.  
  1271.     move.l    readbytes,d1
  1272.     move.l    writtenbytes,d0
  1273.  
  1274.     sub.l    d1,d0
  1275.     bmi    closefiles1        ; Negative
  1276.  
  1277.     move.l    d0,d7
  1278.     beq    closefiles2        ; If zero, no sign
  1279.  
  1280.     move.l    #Text_possign,d2
  1281.     moveq    #1,d3
  1282.     bsr    PrintText
  1283.     bra    closefiles2
  1284.  
  1285. closefiles1:
  1286.     neg.l    d0
  1287.     move.l    d0,d7
  1288.  
  1289.     move.l    #Text_negsign,d2
  1290.     moveq    #1,d3
  1291.     bsr    PrintText
  1292.  
  1293. closefiles2:
  1294.     move.l    d7,d0
  1295.     lea    numberbuf,a0
  1296.     bsr    num2ascii
  1297.  
  1298.     move.l    a0,d2
  1299.     move.l    d0,d3
  1300.     bsr    PrintText
  1301.  
  1302.     move.l    #Text_doublespace,d2
  1303.     moveq    #2,d3
  1304.     bsr    PrintText
  1305.  
  1306.     move.l    writtenbytes,d0
  1307.     move.l    readbytes,d1
  1308.     bsr    percentage
  1309.  
  1310.     lea    numberbuf,a0
  1311.     bsr    num2ascii
  1312.  
  1313.     move.l    a0,d2
  1314.     move.l    d0,d3
  1315.     bsr    PrintText
  1316.  
  1317.     move.l    #Text_percentsign,d2
  1318.     move.l    #5,d3
  1319.     bsr    PrintText
  1320.  
  1321.     move.l    #Text_lf,d2
  1322.     move.l    #1,d3
  1323.     bsr    PrintText
  1324.     bra    EndProgram1
  1325.  
  1326. helptext:
  1327.     move.l    #Text_helptext,d2
  1328.     move.l    #len_helptext,d3
  1329.     bsr    PrintText
  1330.     bra    EndProgram1
  1331.  
  1332. credits:
  1333.     move.l    #Text_credits,d2
  1334.     move.l    #len_credits,d3
  1335.     bsr    PrintText
  1336.     bra    EndProgram1
  1337.  
  1338. CodeError:
  1339.     movem.l    d7,-(a7)
  1340.     move.l    #Text_CodeError,d2
  1341.     move.l    #Len_CodeError,d3
  1342.     bsr    PrintText
  1343.     lea    NumberBuf,a0
  1344.     movem.l    (a7)+,d0
  1345.     bsr    Num2ASCII
  1346.     move.l    a0,d2
  1347.     move.l    d0,d3
  1348.     bsr    PrintText
  1349.     bra    EndProgram1
  1350.  
  1351.     IF    TestMode=1
  1352.  
  1353. Err_TestMode:
  1354.     move.l    #$ffff,d0
  1355.  
  1356. Err_TestMode1:
  1357.     move.w    #$f00,$dff180
  1358.     dbf    d0,Err_TestMode1
  1359.     bra    EndProgram1
  1360.  
  1361.     ENDC
  1362.  
  1363. Err_NoSource:
  1364.     move.l    #Text_NoSource,d2
  1365.     moveq    #28,d3
  1366.     bsr    PrintError
  1367.     bra    EndProgram1
  1368.  
  1369. Err_BadComLine:
  1370.     move.l    #Text_BadComLine,d2
  1371.     moveq    #17,d3
  1372.     bsr    printerror
  1373.     bra    EndProgram1
  1374.  
  1375. Err_NoDest:
  1376.     move.l    #Text_nodest,d2
  1377.     moveq    #33,d3
  1378.     bsr    printerror
  1379.     bra    EndProgram2
  1380.  
  1381. Err_badMode:
  1382.     move.l    #Text_badMode,d2
  1383.     moveq    #24,d3
  1384.     bsr    printerror
  1385.     bra    EndProgram1
  1386.  
  1387. Err_nocomlinespace:
  1388.     move.l    #Text_nocomlinespace,d2
  1389.     moveq    #52,d3
  1390.     bsr    printerror
  1391.     bra    EndProgram1
  1392.  
  1393. Err_badlogic:
  1394.     move.l    #Text_badlogic,d2
  1395.     moveq    #25,d3
  1396.     bsr    printerror
  1397.     bra    EndProgram1
  1398.  
  1399. Err_nomem:
  1400.     move.l    #Text_nomemory,d2
  1401.     moveq    #36,d3
  1402.     bsr    printerror
  1403.     bsr    closesource
  1404.     bra    EndProgram1
  1405.  
  1406. Err_powerpacked:
  1407.     move.l    #Text_powerpacked,d2
  1408.     moveq    #48,d3
  1409.     bsr    printerror
  1410.     bsr    closesource
  1411.     bra    EndProgram1
  1412.  
  1413. Err_seekfail:
  1414.     move.l    #Text_badsource,d2
  1415.     moveq    #23,d3
  1416.     bsr    printerror
  1417.     bsr    closesource
  1418.     bra    EndProgram1
  1419.  
  1420. Err_readfail:
  1421.     move.l    #Text_badsource,d2
  1422.     moveq    #23,d3
  1423.     bsr    printerror
  1424.     bra    EndProgram3
  1425.  
  1426. Err_SourceCorrupt:
  1427.     move.l    #Text_BadSource,d2
  1428.     moveq    #23,d3
  1429.     bsr    PrintError
  1430.     bra    EndProgram1
  1431.  
  1432. Err_DestCorrupt:
  1433.     move.l    #Text_BadDest,d2
  1434.     moveq    #23,d3
  1435.     bsr    PrintError
  1436.     bra    EndProgram1
  1437.  
  1438. Err_SourceIsDir:
  1439.     move.l    #Text_SourceIsDir,d2
  1440.     moveq    #28,d3
  1441.     bsr    PrintError
  1442.     bra    EndProgram1
  1443.  
  1444. Err_WriteFail:
  1445.     move.l    #Text_WriteFail,d2
  1446.     moveq    #18,d3
  1447.     bsr    printerror
  1448.     bra    EndProgram3
  1449.  
  1450. Err_needbuffer:
  1451.     move.l    #Text_needbuffer,d2
  1452.     moveq    #42,d3
  1453.     bsr    printerror
  1454.     bra    EndProgram1
  1455.  
  1456. Err_sameprobability:
  1457.     move.l    #Text_sameprobability,d2
  1458.     moveq    #28,d3
  1459.     bsr    printerror
  1460.     bsr    freememory
  1461.     bra    EndProgram1
  1462.  
  1463. EndProgram5:
  1464.     tst.b    Mode_nobuffer
  1465.     beq    EndProgram6
  1466.  
  1467.     bsr    closesource
  1468.     bsr    closedest
  1469.  
  1470.     move.l    #destname,d1
  1471.     move.l    _DosBase,a6
  1472.     jsr    _LVODeleteFile(a6)        ; *!* Error detection here
  1473.  
  1474.     move.l    #Text_break,d2
  1475.     moveq    #20,d3
  1476.     bsr    PrintText
  1477.     bra    EndProgram1
  1478.  
  1479. EndProgram6:
  1480.     bsr    closedest
  1481.     bsr    freememory
  1482.  
  1483.     move.l    #destname,d1
  1484.     move.l    _DosBase,a6
  1485.     jsr    _LVODeleteFile(a6)        ; error detection here
  1486.  
  1487.     move.l    #Text_break,d2
  1488.     moveq    #20,d3
  1489.     bsr    PrintText
  1490.     bra    EndProgram1
  1491.  
  1492. breakpressed:                ; source and mem open, dest not
  1493.     bsr    freememory
  1494.     bsr    closesource
  1495.     move.l    #Text_break,d2
  1496.     moveq    #20,d3
  1497.     bsr    PrintText
  1498.     bra    EndProgram1
  1499.  
  1500.     bsr    closedest
  1501.  
  1502. EndProgram3:
  1503.     bsr    closesource
  1504.     tst.b    Mode_nobuffer
  1505.     beq    EndProgram3_1
  1506.     bsr    closedest
  1507.     bra    EndProgram1
  1508.  
  1509. EndProgram3_1:
  1510.     bsr    freememory
  1511.     bra    EndProgram1
  1512.  
  1513. EndProgram2:
  1514.     tst.l    SourceHandle        ; closes source if it's open
  1515.     beq    EndProgram1
  1516.     bsr    CloseSource
  1517.  
  1518. EndProgram1:
  1519.     move.l    #Text_cursoron,d2
  1520.     moveq    #5,d3
  1521.     bsr    PrintText
  1522.  
  1523.     move.l    ExecBase,a6
  1524.     move.l    _DosBase,a1
  1525.     jsr    _LVOCloseLibrary(a6)
  1526.     sub.l    d0,d0
  1527.     move.l    OldStack,a7
  1528.     rts
  1529.  
  1530.  
  1531. **********
  1532. ** SUBS **
  1533. **********
  1534.  
  1535. insertEOLs:
  1536.     move.l    EOLs,d3
  1537.     bne    insertEOLs1
  1538.     rts
  1539.  
  1540. insertEOLs1:
  1541.     add.l    d3,d2
  1542.     subq.l    #1,d3
  1543.  
  1544. insertEOLs2:
  1545.     cmp.b    #0,Mode        ; if Mode is negative, adds crs
  1546.     bmi    insertcr
  1547. insertEOLs3:
  1548.     move.b    #10,(a1)+
  1549.     dbf    d3,insertEOLs2
  1550.     clr.l    EOLs
  1551.     rts
  1552.  
  1553. InsertCR:
  1554.     move.b    #13,(a1)+
  1555.     addq.l    #1,d2
  1556.     bra    InsertEOLs3
  1557.  
  1558. freememory:
  1559.     move.l    sourcepointer,a1
  1560.     move.l    sourcelen,d0
  1561.     move.l    ExecBase,a6
  1562.     jsr    _LVOFreeMem(a6)
  1563.     rts
  1564.  
  1565. closedest:
  1566.     move.l    desthandle,d1
  1567.     move.l    _DosBase,a6
  1568.     jsr    _LVOClose(a6)
  1569.     rts
  1570.  
  1571. closesource:
  1572.     move.l    sourcehandle,d1
  1573.     move.l    _DosBase,a6
  1574.     jsr    _LVOclose(a6)
  1575.     rts
  1576.  
  1577. printerror:
  1578.     movem.l    d2/d3,-(a7)
  1579.     move.l    #Text_error,d2
  1580.     move.l    #8,d3
  1581.     bsr    PrintText
  1582.     movem.l    (a7)+,d2/d3
  1583.     bsr    PrintText
  1584.     rts
  1585.  
  1586. PrintText:
  1587.     if    testMode=1
  1588.     rts
  1589.     endc
  1590.  
  1591.     move.l    outstruct,d1
  1592.     move.l    _DosBase,a6
  1593.     jsr    _LVOwrite(a6)
  1594.     rts
  1595.  
  1596. SkipSpace:
  1597.     cmp.b    #" ",(a0)
  1598.     beq    SkipSpace1
  1599.     rts
  1600.  
  1601. SkipSpace1:
  1602.     addq.l    #1,a0
  1603.     cmp.l    CommandEnd,a0
  1604.     bcs    SkipSpace
  1605.     sub.l    a0,a0
  1606.     rts
  1607.  
  1608. FindEnd:
  1609.     cmp.b    #'"',(a0)        ; If the first letter is a quote,
  1610.     beq    FindEnd_Quote        ; go to FindEnd_Quote
  1611.  
  1612. FindEnd_Space:
  1613.     addq.l    #1,a0            ; Get the next position, if it is a
  1614.     cmp.b    #" ",(a0)        ; space, we found the end
  1615.     beq    FindEnd_Space1
  1616.     tst.b    (a0)            ; If it's the end of comline, we found
  1617.     beq    FindEnd_Space1        ; the end of name
  1618.     bra    FindEnd_Space
  1619.  
  1620. FindEnd_Space1:
  1621.     subq.l    #1,a0
  1622.     rts
  1623.  
  1624. FindEnd_Quote:
  1625.     addq.l    #1,a0
  1626.     tst.b    (a0)            ; If end of comline, error
  1627.     beq    FindEnd_Quote2
  1628.     cmp.b    #'"',(a0)
  1629.     bne    FindEnd_Quote
  1630.     rts
  1631.  
  1632. FindEnd_Quote2:
  1633.     sub.l    a0,a0
  1634.     rts
  1635.  
  1636. CopyUntilNull:
  1637.     move.b    (a0)+,(a1)+
  1638.     bne    CopyUntilNull
  1639.     rts
  1640.  
  1641.     INCDIR    "SRC:Routines/"
  1642.     INCLUDE    "Num2ASCII.S"
  1643.     INCLUDE    "Percentage.S"
  1644.     INCLUDE    "CopyName.S"
  1645.  
  1646. **********
  1647. ** DATA **
  1648. **********
  1649.  
  1650.     section    fastdata,data
  1651.  
  1652. SourcePointer:
  1653.     dc.l    SourceBuf
  1654.  
  1655. SpacePointer:
  1656.     dc.l    SpaceBuf
  1657.  
  1658. ***********************
  1659. ** Conversion tables **
  1660. ***********************
  1661.  
  1662. ; The byte from which to convert is on the right, and the byte into which it
  1663. ; turns is on the left.  If a null is on the left, it means the byte doesn't
  1664. ; get to the destination file at all.
  1665.  
  1666.  
  1667. table_topc:
  1668.     dc.b    $00,$0d
  1669.     dc.b    $00,$1a
  1670.     dc.b    $84,"ä"
  1671.     dc.b    $8e,"Ä"
  1672.     dc.b    $94,"ö"
  1673.     dc.b    $99,"Ö"
  1674.     dc.w    0
  1675.  
  1676. table_null:
  1677.     dc.b    $00,$0d
  1678.     dc.b    $00,$1a
  1679.     dc.w    0
  1680.  
  1681. table_tosf7:
  1682.     dc.b    $00,$0d
  1683.     dc.b    $00,$1a
  1684.     dc.b    "{","ä"
  1685.     dc.b    "|","ö"
  1686.     dc.b    "[","Ä"
  1687.     dc.b    "\","Ö"
  1688.     dc.w    0
  1689.  
  1690. table_fromsf7:
  1691.     dc.b    $00,$0d
  1692.     dc.b    $00,$1a
  1693.     dc.b    "ä","{"
  1694.     dc.b    "ö","|"
  1695.     dc.b    "Ä","["
  1696.     dc.b    "Ö","\"
  1697.     dc.w    0
  1698.  
  1699. Table_FromPC:    ; 0  1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  1700.     dc.b    "Ç","ü","e","å","ä","a","a","ç","ê","ë","e","ï","î","i","Ä","a"
  1701.     dc.b    "E","æ","Æ","ô","ö","o","û","u","ÿ","Ö","ü",$a2,"£",$a5,"P","f"
  1702.     dc.b    "a","i","o","u","n","N","ª","º","¿","+","+","½","¼",$a1,"«","»"
  1703.     dc.b    $7f,$7f,$7f,"|","+","#","#","+","#","#","|","#","#","+","+","+"
  1704.     dc.b    "+","+","+","+","-","+","#","#","#","#","#","#","#","=","#","#"
  1705.     dc.b    "#","+","+","+","+","+","+","#","#","+","+",$7f,"æ","[","]","^"
  1706.     dc.b    "c","ß","r","#","E","ó","y","i","o","0","o","ð","°","0","E","A"
  1707.     dc.b    "=","±",">","<","í","j","÷","~","°","·","·","V","n","²","·"," "
  1708.  
  1709.     INCDIR    "SRC:Port/"
  1710.  
  1711. Text_CodeError:
  1712.     INCBIN    "PortCodeError"
  1713.  
  1714. Text_helptext:
  1715.     INCBIN    "PortOpts1"        ; Don't change the way these lines are
  1716.                     ; arranged!
  1717. Text_credits:
  1718.     INCBIN    "PortOpts2"
  1719.  
  1720. Text_CursorOff:
  1721.     dc.b    27,"[0 p"
  1722.  
  1723. Text_CursorOn:
  1724.     dc.b    27,"[1 p"
  1725.  
  1726. Text_Error:
  1727.     dc.b    "ERROR!  "
  1728.  
  1729. Text_BadComLine:
  1730.     dc.b    "Bad commandline.",10
  1731.  
  1732. Text_NoSource:
  1733.     dc.b    "Could not open source file.",10
  1734.  
  1735. Text_NoDest:
  1736.     dc.b    "Could not open destination file.",10
  1737.  
  1738. Text_SourceIsDir:
  1739.     dc.b    "Source file is a directory.",10
  1740.  
  1741. Text_badMode:
  1742.     dc.b    "Bad mode specification.",10
  1743.  
  1744. Text_WriteFail:
  1745.     dc.b    "Can't write data.",10
  1746.  
  1747. Text_nocomlinespace:
  1748.     dc.b    "The mode must be separated with at least one space.",10
  1749.  
  1750. Text_badlogic:
  1751.     dc.b    "Conflict in commandline.",10
  1752.  
  1753. Text_nomemory:
  1754.     dc.b    "Not enough memory to load the file.",10
  1755.  
  1756. Text_powerpacked:
  1757.     dc.b    "File is a PowerPacker data file, can't process.",10
  1758.  
  1759. Text_badsource:
  1760.     dc.b    "Source file corrupted.",10
  1761.  
  1762. Text_BadDest:
  1763.     dc.b    "Destination corrupted.",10
  1764.  
  1765. Text_needbuffer:
  1766.     dc.b    "Auto-mode only works with buffered input.",10
  1767.  
  1768. Text_SameProbability:
  1769.     dc.b    "Can't decide between modes.",10
  1770.  
  1771. Text_input:
  1772.     dc.b    27,"[1mInput:",27,"[0m "
  1773.  
  1774. Text_output:
  1775.     dc.b    "  ",27,"[1mOutput:",27,"[0m "
  1776.  
  1777. Text_read:
  1778.     dc.b    27,"[1mRead:",27,"[0m "
  1779.  
  1780. Text_converted:
  1781.     dc.b    27,"[1mConverted:",27,"[0m "
  1782.  
  1783. Text_checking:
  1784.     dc.b    27,"[1mChecking file type...",27,"[0m",27,"[0K",13
  1785.  
  1786. Text_uses:
  1787.     dc.b    27,"[1mType:",27,"[0m "
  1788.  
  1789. Text_nullMode:
  1790.     dc.b    "Amiga",27,"[0K",10
  1791.  
  1792. Text_sf7Mode:
  1793.     dc.b    "SF7",27,"[0K",10
  1794.  
  1795. Text_PCMode:
  1796.     dc.b    "PC",27,"[0K",10
  1797.  
  1798. Text_break:
  1799.     dc.b    27,"[1m-BREAK-",27,"[0m",27,"[0K",10
  1800.  
  1801. Text_clearEOL:
  1802.     dc.b    27,"[0K"
  1803.  
  1804. _DosName:
  1805.     dc.b    "dos.library",0
  1806.  
  1807. Text_amigasuf:
  1808.     dc.b    ".AMY"
  1809.  
  1810. Text_PCsuf:
  1811.     dc.b    ".PC"
  1812.  
  1813. Text_sf7suf:
  1814.     dc.b    ".SF7"
  1815.  
  1816. Text_CR:
  1817.     dc.b    13
  1818.  
  1819. Text_LF:
  1820.     dc.b    10
  1821.  
  1822. Text_Final:
  1823.     dc.b    27,"[1mFile size change:",27,"[0m "
  1824.  
  1825. Text_negsign:
  1826.     dc.b    "-"
  1827.  
  1828. Text_possign:
  1829.     dc.b    "+"
  1830.  
  1831. Text_percentsign:
  1832.     dc.b    "%",27,"[0K"
  1833.  
  1834. Text_doublespace:
  1835.     dc.b    "  "
  1836.  
  1837. Text_slash:
  1838.     dc.b    "/"
  1839.  
  1840. Text_Suffixes:
  1841.     dc.b    ".TXT",0
  1842.     dc.b    ".DOC",0
  1843.     dc.b    ".AMY",0
  1844.     dc.b    ".SF7",0
  1845.     dc.b    ".PC",0
  1846.     dc.b    ".ASC",0
  1847.     dc.b    ".ANS",0
  1848.     dc.b    ".LST",0
  1849.     dc.b    ".NFO",0
  1850.     dc.b    $ff
  1851.  
  1852.     IF    TestMode=1
  1853.  
  1854. Test_ComLine:
  1855.     dc.b    'P ram:ankka1 ram:shit',10
  1856.  
  1857. Test_ComLineEnd:
  1858.  
  1859. Test_Len    =    Test_ComLineEnd-Test_ComLine
  1860.  
  1861.     ENDC
  1862.  
  1863.     SECTION    FastBlank,BSS
  1864.  
  1865. FIB:
  1866.     ds.b    fib_SIZEOF
  1867.  
  1868. OldStack:
  1869.     ds.l    1
  1870.  
  1871. DestNameLen:
  1872.     ds.l    1
  1873.  
  1874. SourceLock:
  1875.     ds.l    1
  1876.  
  1877. DestLock:
  1878.     ds.l    1
  1879.  
  1880. Eols:
  1881.     ds.l    1
  1882.  
  1883. Readasciiaddr:
  1884.     ds.l    1
  1885.  
  1886. Table:
  1887.     ds.l    1
  1888.  
  1889. Sourcelen:
  1890.     ds.l    1
  1891.  
  1892. Tabs:
  1893.     ds.l    1
  1894.  
  1895. Writtenbytes:
  1896.     ds.l    1
  1897.  
  1898. Readbytes:
  1899.     ds.l    1
  1900.  
  1901. Leftbytes:
  1902.     ds.l    1
  1903.  
  1904. Inputbytes:
  1905.     ds.l    1
  1906.  
  1907. Sourcehandle:
  1908.     ds.l    1
  1909.  
  1910. Desthandle:
  1911.     ds.l    1
  1912.  
  1913. Outstruct:
  1914.     ds.l    1
  1915.  
  1916. Destnamestart:
  1917.     ds.l    1
  1918.  
  1919. Sourcenamestart:
  1920.     ds.l    1
  1921.  
  1922. Sourcenamelen:
  1923.     ds.l    1
  1924.  
  1925. Commandstarrt:
  1926.     ds.l    1
  1927.  
  1928. Commandend:
  1929.     ds.l    1
  1930.  
  1931. Commandlen:
  1932.     ds.l    1
  1933.  
  1934. _DosBase:
  1935.     ds.l    1
  1936.  
  1937. Spacenumber:
  1938.     ds.l    1
  1939.  
  1940. Readasciilen:
  1941.     ds.l    1
  1942.  
  1943. Sourcelenasciilen:
  1944.     ds.l    1
  1945.  
  1946. Sourcelenasciiaddr:
  1947.     ds.l    1
  1948.  
  1949. Col:
  1950.     ds.w    1
  1951.  
  1952. Sourcebuf:
  1953.     ds.b    1024
  1954.  
  1955. RealSourceName:
  1956.     ds.b    108            ; Max filename size in FIB
  1957.  
  1958. Sourcename:
  1959.     ds.b    256
  1960.  
  1961. Destname:
  1962.     ds.b    256
  1963.  
  1964. Destbuf:
  1965.     ds.b    9216
  1966.  
  1967. Spacebuf:
  1968.     ds.b    1024
  1969.  
  1970. Numberbuf:
  1971.     ds.b    10
  1972.  
  1973. Readascii:
  1974.     ds.b    10
  1975.  
  1976. Sourcelenascii:
  1977.     ds.b    10
  1978.  
  1979. Mode:
  1980.     ds.b    1
  1981.  
  1982. TabSize:
  1983.     ds.b    1
  1984.  
  1985. SpaceSize:
  1986.     ds.b    1
  1987.  
  1988. size_MakeEOLs:
  1989.     ds.b    1
  1990.  
  1991. prespace:
  1992.     ds.b    1
  1993.  
  1994. Mode_case:
  1995.     ds.b    1
  1996.  
  1997. Mode_nocutspace:
  1998.     ds.b    1
  1999.  
  2000. Mode_Quiet:
  2001.     ds.b    1
  2002.  
  2003. Mode_nobuffer:
  2004.     ds.b    1
  2005.  
  2006. Len_CodeError    =    Text_HelpText-Text_CodeError
  2007. Len_HelpText    =    Text_Credits-Text_HelpText
  2008. Len_Credits    =    Text_CursorOff-Text_Credits
  2009.